/*
 * @Title:  TableModule.java   
 * @Package com.shelai.mybatis.table   
 * @Description:    TODO(用一句话描述该文件做什么)   
 * @author: 李凯     
 * @date:   2018年6月13日 下午11:23:41   
 * @version V1.0 
 */
package com.frames.table.single.module;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Param;

import com.frames.table.single.operate.Table;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.utils.transtype.JsonObjectUtil;

/*  
 * @ClassName:  TableModule   
 * @Description:   单表增删改查
 * @author: 李凯
 * @date:   2018年6月13日 下午11:23:41   
 *     
 */
public interface TablesModule {

	int add(@Param("table") Table table);// 添加数据

	int batchAdd(@Param("tables") List<Table> tables);// 批量添加数据
	
	

	int delete(@Param("table") Table table);//删除数据 
		
	int batchDelete(@Param("tables") List<Table> tables);//批量删除数据
	
	int batchDeleteById(@Param("ids") Object[] ids, @Param("table") Table table);// 根据id批量删除数据
	
	

	int updateById(@Param("table") Table table);// 根据id修改数据
	
	int batchUpdateById(@Param("tables") List<Table> tables);// 根据id批量更新数据

	int updateByCondition(@Param("col") Table col, @Param("con") Table con);// 根据条件修改数据
	
	

	int getCount(@Param("table") Table table);// 获取数据总数
	
	int intSum(@Param("col") String col,@Param("table") Table table);// 指定列整数求和
	
	double doubleSum(@Param("col") String col,@Param("table") Table table);// 指定列double求和
	
	

	<T> Map<String, Object> slelectOne(@Param("table") T table);// 获取一条数据

	<T> List<Map<String, Object>> selectList(@Param("table") T table);// 获取多条数据
	
	// 获取一条数据
	@SuppressWarnings("unchecked")
	default <T> T getOne(T bean) throws Exception {
		Map<String, Object> data = slelectOne(bean);
		return (T) JsonObjectUtil.ALWAYS.mapToObject(data, bean.getClass());
	}

	// 获取多条数据不分页
	@SuppressWarnings("unchecked")
	default <T> List<T> getList(T bean) throws Exception {
		List<Map<String, Object>> data = selectList(bean);
		String jsonList=JsonObjectUtil.ALWAYS.objectToJson(data);
		return (List<T>) JsonObjectUtil.ALWAYS.jsonToObjectList(jsonList,bean.getClass());
	}
	
	// 获取分页多条数据,返回对象集合
	@SuppressWarnings("unchecked")
	default <T> PageInfo<T> getPageList(T bean) throws Exception {
		Table table=(Table) bean;
		PageHelper.startPage(table.getPageNum(), table.getPageSize());// 设置分页，pageSize=0则不会分页
		Page<Map<String, Object>> data = (Page<Map<String, Object>>) selectList(table);
		String jsonList=JsonObjectUtil.ALWAYS.objectToJson(data);
		
		List<T> beanList=(List<T>) JsonObjectUtil.ALWAYS.jsonToObjectList(jsonList,table.getClass());
		PageInfo<T> pageInfo=new PageInfo<>(beanList);
		return pageInfo;
	}
	
	// 获取分页多条数据,返回map数据集合
	default <T> PageInfo<Map<String, Object>> getPageListMap(T bean) throws Exception {
		Table table=(Table) bean;
		PageHelper.startPage(table.getPageNum(), table.getPageSize());// 设置分页，pageSize=0则不会分页
		Page<Map<String, Object>> data = (Page<Map<String, Object>>) selectList(table);
		PageInfo<Map<String, Object>> page=new PageInfo<>(data);
		return page;		
	}
	

}
